package utils

import (
	"crypto/md5"
	"encoding/hex"
	"io"
	"os"
)

const key = "hahaGo90"


/*
写法                                      	实际行为 
 h.Sum(nil)     							 返回真正的 MD5 值 
 h.Sum([]byte(key)) 						 把  key  拼在 MD5 值前面，不是加盐，是拼结果 


 如果你只是想要标准 MD5，用  h.Sum(nil) 。
 如果你想要加盐 MD5，把盐写在前面或后面，再  Sum(nil) 


 1.  Write  —— 喂数据（可多次调用）

h.Write([]byte("hello")) // 第一次喂
h.Write([]byte("world")) // 继续喂，内部状态会累积

不会返回哈希值，只是更新内部状态。
可以多次调用，顺序不同结果就不同


2 Sum  —— 拿二进制结果    
 hashBytes := h.Sum(nil) // 返回 16 字节的[]byte
参数是“前缀”：
  Sum(prefix)  ≡  append(prefix, 实际哈希...) 
 通常我们只想拿哈希，就传  nil 。
 不会改变哈希对象内部状态，你可以继续  Write  再  Sum ，得到“到目前为止”的哈希。


3  hex.EncodeToString  —— 把二进制转 16 进制字符串

只负责“编码”，与哈希算法无关。
如果直接  fmt.Println(hashBytes)  会打印一堆不可见字符。



原始数据 ---> [Write] ---> md5 内部状态
                              |
                              v
                         [Sum(nil)] ---> 16 字节二进制  sum就是总和的意思
                              |
                              v
                    [hex.EncodeToString] ---> 32 字符 hex 字符串


				

Sum(data []byte) []byte 
将当前的哈希状态追加到  data  后面，并返回结果，不会修改哈希状态。




h.Sum([]byte(key))等价于 tmp := append([]byte(key), h.Sum(nil)...)


value := "hello"
key := "hahaGo90"




*/






/*
*
md5 

标准 MD5("hello")
5d41402abc4b2a76b9719d911017c592


❗ 你的代码实际输出的是
hex.EncodeToString([]byte("hahaGo90") + md5("hello"))

68616861476f39305d41402abc4b2a76b9719d911017c592     前面一节是hahaGo90 编码
*/
func Md5String(value string) string {



	h := md5.New()
	h.Write([]byte(value))
	return hex.EncodeToString(h.Sum([]byte(key)))
}



//md5的值
func GetMD5Hash(text string) string {
	hash := md5.Sum([]byte(text))
	return hex.EncodeToString(hash[:])
}

//文件的MD5
func GetFileMD5(filePath string) (string, error) {
	file, err := os.Open(filePath)
	if err != nil {
		return "", err
	}
	defer file.Close()

	hash := md5.New()
	if _, err := io.Copy(hash, file); err != nil {
		return "", err
	}

	return hex.EncodeToString(hash.Sum(nil)), nil
}

//加盐 MD5

func Md5String1(value string) string {
	h := md5.New()
	h.Write([]byte(key)) // 先写盐
	h.Write([]byte(value)) // 再写值
	return hex.EncodeToString(h.Sum(nil))
}